From ee35c5fbf6f44dd7fd56a15f9af36a4f19c10cd1 Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Tue, 28 Mar 2006 14:19:22 +0100 Subject: [PATCH] Change do_IRQ high bit masking. Allow more than 256 interrupt vectors on native by only setting the highest bit when marking orig_eax to indicate that we're not within a system call. Signed-off-by: Christian Limpach --- linux-2.6-xen-sparse/arch/i386/kernel/entry-xen.S | 4 ++-- linux-2.6-xen-sparse/arch/i386/kernel/irq-xen.c | 4 ++-- linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S | 2 +- linux-2.6-xen-sparse/arch/x86_64/kernel/irq-xen.c | 4 ++-- linux-2.6-xen-sparse/drivers/xen/core/evtchn.c | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/entry-xen.S b/linux-2.6-xen-sparse/arch/i386/kernel/entry-xen.S index ec17d1c91f..3d05727fdf 100644 --- a/linux-2.6-xen-sparse/arch/i386/kernel/entry-xen.S +++ b/linux-2.6-xen-sparse/arch/i386/kernel/entry-xen.S @@ -462,7 +462,7 @@ vector=0 ENTRY(irq_entries_start) .rept NR_IRQS ALIGN -1: pushl $vector-256 +1: pushl 0x80000000+$vector jmp common_interrupt .data .long 1b @@ -479,7 +479,7 @@ common_interrupt: #define BUILD_INTERRUPT(name, nr) \ ENTRY(name) \ - pushl $nr-256; \ + pushl 0x80000000+$nr; \ SAVE_ALL \ movl %esp,%eax; \ call smp_/**/name; \ diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/irq-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/irq-xen.c index d4b97538e0..b1d8634bd6 100644 --- a/linux-2.6-xen-sparse/arch/i386/kernel/irq-xen.c +++ b/linux-2.6-xen-sparse/arch/i386/kernel/irq-xen.c @@ -53,8 +53,8 @@ static union irq_ctx *softirq_ctx[NR_CPUS]; */ fastcall unsigned int do_IRQ(struct pt_regs *regs) { - /* high bits used in ret_from_ code */ - int irq = regs->orig_eax & __IRQ_MASK(HARDIRQ_BITS); + /* high bit used in ret_from_ code */ + int irq = regs->orig_eax & __IRQ_MASK(BITS_PER_LONG - 1); #ifdef CONFIG_4KSTACKS union irq_ctx *curctx, *irqctx; u32 *isp; diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S b/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S index 08b5f53f6a..ea24701bb8 100644 --- a/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S +++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S @@ -584,7 +584,7 @@ retint_kernel: */ .macro apicinterrupt num,func INTR_FRAME - pushq $\num-256 + pushq 0x8000000000000000+$\num CFI_ADJUST_CFA_OFFSET 8 interrupt \func jmp error_entry diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/irq-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/irq-xen.c index c64715db9e..663e890c94 100644 --- a/linux-2.6-xen-sparse/arch/x86_64/kernel/irq-xen.c +++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/irq-xen.c @@ -96,8 +96,8 @@ skip: */ asmlinkage unsigned int do_IRQ(struct pt_regs *regs) { - /* high bits used in ret_from_ code */ - int irq = regs->orig_rax & __IRQ_MASK(HARDIRQ_BITS); + /* high bit used in ret_from_ code */ + int irq = regs->orig_rax & __IRQ_MASK(BITS_PER_LONG - 1); exit_idle(); irq_enter(); diff --git a/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c b/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c index 5fbd1e087a..6dee25cab7 100644 --- a/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c +++ b/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c @@ -170,9 +170,9 @@ static inline void exit_idle(void) {} #include #define IRQ_REG orig_rax #endif -#define do_IRQ(irq, regs) do { \ - (regs)->IRQ_REG = (irq); \ - do_IRQ((regs)); \ +#define do_IRQ(irq, regs) do { \ + (regs)->IRQ_REG = (irq) | (1UL << (BITS_PER_LONG - 1)); \ + do_IRQ((regs)); \ } while (0) #endif -- 2.30.2